import http from 'wechat-http'

//仿照了axios的使用

// 1.baseURL
// 等同于 axios.defaults.baseURL
http.baseURL = 'https://live-api.itheima.net'

// 2.配置响应拦截器
http.intercept.response = async ({ statusCode, data, config }) => {
  // 如果状态码是401，表明token和refresh_token失效
  // 如果调用的接口是refreshToken 就表明refreshToken失效了
  if (statusCode === 401) {
    if (config.url.includes('/refreshToken')) {
      // refreshToken失效

      // 读取当前历史栈
      const pageStack = getCurrentPages()
      // 取出当前页面路径，登录成功能跳转到该页面
      const currentPage = pageStack[pageStack.length - 1]
      // 取出当前页面路径，登录成功能跳转到该页面
      const redirectURL = currentPage.route
      // 引导用户到登录页面
      return wx.redirectTo({
        url: `/pages/login/index?redirectURL=/${redirectURL}`,
      })
      // 这样当用户登录后返回时，仍然是登录前页面
    }

    const refresh_token = getApp().refresh_token

    // 如果请求失败，且没有refresh_token，则停止执行函数
    if (!refresh_token) {
      return wx.redirectTo({
        url: '/pages/login/index',
      })
    }

    const res = await http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: refresh_token,
      },
    })
    console.log(res)
    // 将新token更新到本地
    getApp().setToken(res.data.token, res.data.refreshToken)
    // 将401的请求自动重新发送（更好的用户体验）
    const newToken = getApp().token
    return http({
      ...config,
      header: {
        Authorization: newToken,
      },
    })
  }
  // 其中 data 是我们需要的信息，所以只将服务器接口的数据返回
  return data
}

// 3.配置请求拦截器
http.intercept.request = (params) => {
  const { token } = getApp()
  // 指定默认的头信息，方便以后拓展
  const defaultHeader = {}
  // 如果有token，则为头信息添加
  if (token) {
    defaultHeader.Authorization = token
  }
  // 将公共头信息与自定义头信息合并
  params.header = Object.assign(defaultHeader, params.header)

  return params
}

// 导出
wx.http = http //将封装的http挂载到全局对象wx上，即在任意页面都可以直接使用（无需导入）
export default http //作为模块导出
